#include <cstdlib>
#include <iostream>

#define MAX_SIZE 10

using namespace std;
typedef struct SeqList {
	// 指针指向一个内存地址
	int *data;
	// 最大长度
	int maxSize;
	// 当前长度
	int length;
} SeqList;

/**
 * 遍历打印 
 */
void print(SeqList l) {
	printf("数据长度：%d\n", l.length);
	printf("最大长度：%d\n", l.maxSize);
	printf("现有数据：");
	for (int i = 0; i < l.length; i++) {
		if (i < l.length - 1) {
			printf("%d,", l.data[i]);
		} else {
			printf("%d\n", l.data[i]);
		}
	}
}

/**
 * 初始化 
 */
SeqList initSeqList() {
	SeqList l;
	l.data = (int *) malloc(MAX_SIZE * sizeof(int));
	l.maxSize = MAX_SIZE;
	l.length = 0;
	for (int i = 0; i < l.length; i++) {
		l.data[i] = 0;
	}
	return l;
}

/**
 * 销毁 
 */
bool destroy(SeqList *l) {
	if (l == nullptr) {
		return true;
	}
	free(l->data);
	l->data = nullptr;
	free(l);
//	l = nullptr;
	return true;
}

/**
 * 扩展顺序表的最大容量
 * @param &l 顺序表
 * @param length 要扩展的长度 
 */
bool extend(SeqList &l, int length) {
	int *temp = l.data;
	l.data = (int *)malloc((l.maxSize + length) * sizeof(int));
	for(int i = 0; i < l.length; i++) {
		l.data[i] = temp[i];
	}
	l.maxSize += length;
//	free(temp);
	return true;
}

/**
 * 长度和最大容量比较 
 * @param l 顺序表
 */
int seqLengthEqualMaxSize(SeqList l) {
	int length = l.length;
	int maxSize = l.maxSize;
	if (length == maxSize) {
		return 0;
	}

	if (length < maxSize) {
		return 1;
	}
	return -1;
}

/**
 * 插入到最后一个 
 * @param &l 顺序表
 * @param data 要插入的数据 
 */
bool addToLast(SeqList &l, int data) {
	int result = seqLengthEqualMaxSize(l);
	if (result == 0 || result == -1) {
		return false;
	}
	l.data[l.length] = data;
	l.length++;
	return true;
}

/**
 * 插入到第一个 
 * @param &l 顺序表
 * @param data 要插入的数据 
 */
bool addToFirst(SeqList &l, int data) {
	int result = seqLengthEqualMaxSize(l);
	if (result == 0 || result == -1) {
		return false;
	}
	for (int i = l.length - 1; i >= 0; i--) {
		l.data[i + 1] = l.data[i];
	}
	l.data[0] = data;
	l.length++;
	return true;
}

/**
 * 添加到相应的位置
 * @param &l 顺序表
 * @patam data 要添加的数据
 * @patam index 元素下标 
 */
bool addToIndex(SeqList &l, int data, int index) {
	int result = seqLengthEqualMaxSize(l);
	if (result == 0 || result == -1 || index > l.length) {
		return false;
	}

	if (index == 0) {
		addToFirst(l, data);
		return true;
	}

	if (index == l.length) {
		addToLast(l, data);
		return true;
	}

	for (int i = l.length - 1; i >= index; i--) {
		l.data[i + 1] = l.data[i];
	}
	l.data[index] = data;
	l.length++;
	return true;
}

/**
 * 删除最后一个元素
 * @param &l 顺序表 
 */
bool removeToLast(SeqList &l) {
	if (l.length <= 0) {
		return false;
	}
	l.data[l.length - 1] = 0;
	l.length--;
	return true;
}

/**
 * 删除第一个元素
 * @param &l 顺序表 
 */
bool removeToFirst(SeqList &l) {
	if (l.length <= 0) {
		return false;
	}
	for (int i = 0; i < l.length - 1; i++) {
		l.data[i] = l.data[i + 1];
	}
	l.data[l.length - 1] = 0;
	l.length--;
	return true;
}

/**
 * 删除相应位置的元素
 * @param &l 顺序表
 * @patam index 元素下标 
 */
bool removeToIndex(SeqList &l, int index) {
	if (index < 0 || index >= l.length || index > l.length) {
		return false;
	}

	if (index == 0) {
		removeToFirst(l);
		return true;
	}

	if (index == l.length - 1) {
		removeToLast(l);
		return true;
	}

	for (int i = index; i < l.length - 1; i++) {
		l.data[i] = l.data[i + 1];
	}
	l.data[l.length - 1] = 0;
	l.length--;
	return true;
}